double pdb_read_double(void *p);
void pdb_write_double(void *pp, double d);
+/*
+ * Prototypes for generic conversion routines (util.c).
+ */
+
+double ddmm2degrees(double ddmm_val);
+double degrees2ddmm(double deg_val);
+
/*
* A constant for unknown altitude. It's tempting to just use zero
* but that's not very nice for the folks near sea level.
static char * termread(char *ibuf, int size);
static void termwrite(char *obuf, int size);
-static double mag2degrees(double mag_val);
static void mag_readmsg(void);
static void mag_handon(void);
static void mag_handoff(void);
waypt->creation_time = mktime(&tm) + get_tz_offset() ;
if (latdir == 'S') latdeg = -latdeg;
- waypt->position.latitude.degrees = mag2degrees(latdeg);
+ waypt->position.latitude.degrees = ddmm2degrees(latdeg);
if (lngdir == 'W') lngdeg = -lngdeg;
- waypt->position.longitude.degrees = mag2degrees(lngdeg);
+ waypt->position.longitude.degrees = ddmm2degrees(lngdeg);
waypt->position.altitude.altitude_meters = alt;
return icon_mapping[0].token;
}
-static double
-mag2degrees(double mag_val)
-{
- double minutes;
- double tmp_val;
- double return_value;
- int deg;
-
- /*
- * magellan value is DDMM.MM
- * e.g. 36 3.85 would be coded as 3603.85
- */
- tmp_val = mag_val / 100.0;
- deg = (int) tmp_val;
- minutes = (tmp_val - deg) * 100.0;
- minutes /= 60.0;
- return_value = (double) deg + minutes;
- return return_value;
-}
-
/*
* Given an incoming waypoint messages of the form:
* $PMGNWPL,3549.499,N,08650.827,W,0000257,M,HOME,HOME,c*4D
icon_token[i++] = '\0';
if (latdir == 'S') latdeg = -latdeg;
- waypt->position.latitude.degrees = mag2degrees(latdeg);
+ waypt->position.latitude.degrees = ddmm2degrees(latdeg);
if (lngdir == 'W') lngdeg = -lngdeg;
- waypt->position.longitude.degrees = mag2degrees(lngdeg);
+ waypt->position.longitude.degrees = ddmm2degrees(lngdeg);
waypt->position.altitude.altitude_meters = alt;
waypt->shortname = xstrdup(shortname);
desc);
sscanf(&ibuf[116], "%d",
&symnum);
-
desc[sizeof(desc)-1] = '\0';
name[sizeof(name)-1] = '\0';
wpt_tmp = xcalloc(sizeof(*wpt_tmp), 1);
if (latdir == 'S') lat = -lat;
if (londir == 'W') lon = -lon;
- wpt_tmp->position.longitude.degrees = lon/100.0;
- wpt_tmp->position.latitude.degrees = lat/100.0;
+ wpt_tmp->position.longitude.degrees = ddmm2degrees(lon);
+ wpt_tmp->position.latitude.degrees = ddmm2degrees(lat);
waypt_add(wpt_tmp);
break;
default:
gpsutil_disp(const waypoint *wpt)
{
double lon,lat;
- signed int ilon, ilat;
int icon_token = 0;
char tbuf[1024];
char *tp = tbuf;
time_t tm = wpt->creation_time;
- ilon = (signed int)wpt->position.longitude.degrees;
- ilat = (signed int)wpt->position.latitude.degrees;
- lon = (ilon * 100.0) + (wpt->position.longitude.degrees - ilon) * 60.0;
- lat = (ilat * 100.0) + (wpt->position.latitude.degrees - ilat) * 60.0;
+ lon = degrees2ddmm(wpt->position.longitude.degrees);
+ lat = degrees2ddmm(wpt->position.latitude.degrees);
if (tm == 0)
tm = time(NULL);
}
return;
}
+
+// Magellan and PCX formats use this DDMM.mm format
+double ddmm2degrees(double pcx_val) {
+ double minutes;
+ signed int deg;
+ deg = (signed int) (pcx_val / 100.0);
+ minutes = (((pcx_val / 100.0) - deg) * 100.0) / 60.0;
+ return (double) deg + minutes;
+}
+
+double degrees2ddmm(double deg_val) {
+ signed int deg;
+ deg = (signed int) deg_val;
+ return (double) (deg * 100.0) + ((deg_val - deg) * 60.0);
+}